package com.sheng.leetcode.year2022.month10.day09;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/10/09
 *<p>
 * 856. 括号的分数<p>
 *<p>
 * 给定一个平衡括号字符串S，按下述规则计算该字符串的分数：<p>
 * () 得 1 分。<p>
 * AB 得A + B分，其中 A 和 B 是平衡括号字符串。<p>
 * (A) 得2 * A分，其中 A 是平衡括号字符串。<p>
 *<p>
 * 示例 1：<p>
 * 输入： "()"<p>
 * 输出： 1<p>
 *<p>
 * 示例 2：<p>
 * 输入： "(())"<p>
 * 输出： 2<p>
 *<p>
 * 示例3：<p>
 * 输入： "()()"<p>
 * 输出： 2<p>
 *<p>
 * 示例4：<p>
 * 输入： "(()(()))"<p>
 * 输出： 6<p>
 *<p>
 * 提示：<p>
 * S是平衡括号字符串，且只含有(和)。<p>
 * 2 <= S.length <= 50<p>
 *<p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/score-of-parentheses">...</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode0856 {

    @Test
    public void test01() {
//        String s = "()";
//        String s = "(())";
//        String s = "()()";
//        String s = "(()(()))";
//        String s = "(())()";
        String s = "(())(())";
        System.out.println(new Solution().scoreOfParentheses(s));
    }
}
class Solution {
    char[] chars = {'(', ')'};
    public int scoreOfParentheses(String s) {
        if ("()".equals(s)) {
            return 1;
        }
        int length = s.length();
        int sum = 0;
        // 左括号的数量
        int left = 0;
        // 右括号的数量
        int right = 0;
        // 每次分割后的新起点
        int index = 0;
        for (int i = 0; i < length; i++) {
            // 计算左右括号的数量
            if (s.charAt(i) == chars[0]) {
                left++;
            } else {
                right++;
            }
            // 左右括号数量保持一致时，意味着和后面的字符串部分是加法，要进行分割
            if (left == right) {
                // 如果该字符串是个()，那么直接加一
                if (i - index <= 2) {
                    sum += 1;
                    index = i + 1;
                } else {
                    // 否则，将括号中间的字符串取出
                    String substring = s.substring(index + 1, i);
                    // 重置起点
                    index = i + 1;
                    // 将新字符串的值 * 2作为当前值，放入结果sum中
                    sum = sum + 2 * scoreOfParentheses(substring);
                }
            }
        }
        return sum;
    }
}
